• 技巧1:理解面向链接和无连接协议之间的区别

    • 对于无连接协议来说,每个分组的处理都独立于所有其他分组,而对于面向连接的协议来说,协议实现维护了与后继分组有关的状态信息。
    • 对TCP来说,连接完全是想象的,它是由端点所记忆的状态组成的, 并不存在“物理”连接。
  • 技巧2:理解子网和CIDR的概念

    • A、B、C、D、E类网络,网络ID和主机ID
    • 子网划分
    • CIDR——Classless Inter Domain Routing,无类别域间路由
  • 技巧3:理解私有地址和NAT

    • 10.0.0.0-10.255.255.255(前缀10/8)、172.16.0.0-172.31.255.255(前缀172.16/12)、192.168.0.0-192.168.255.255(前缀192.168/16)
    • NAT——Network Address Translation,网络地址翻译
    • PAT——Port Address Translation,端口地址转换
  • 技巧4:开发并使用应用程序“框架”

    • TCP服务端:socket->bind->listen->accept
    • TCP客户端:socket->connect
    • UDP服务端:socket->bind
    • UDP客户端:socket
  • 技巧5:套接字接口比XTI/TLI更好用

  • 技巧6:记住,TCP是一种流协议

    • TCP是一种流协议,数据以字节流的形式传递给接收者的,没有固有的“报文”或“报文边界”的概念
  • 技巧7:不要低估TCP的性能

  • 技巧8:避免重新编写TCP

  • 技巧9:要认识到TCP是一个可靠的,但并不绝对可靠的协议

  • 技巧10:记住,TCP/IP不是轮询的

    • TCP没有提供将连接丢失即时通知给应用程序的方法
    • 保持活跃(keep-alive)
    • 心跳信号(epoll, pthread)
  • 技巧11:提防对等尸体的不友好动作

  • 技巧12:成功的LAN策略不一定能推广到WAN中

  • 技巧13:了解协议是怎样工作的

    • RFC是TCP/IP的官方规范
  • 技巧14:不要把OSI七层参考模型太当回事

    • OSI和TCP/IP
  • 技巧15:理解TCP的写操作

    • 从应用程序的角度来看,最好把写操作当作是一项将数据从用户空间拷贝到内核发送缓冲区,然后就返回的操作。
    • 如果发送端应用程序崩溃了,TCP会继续尝试着将数据传递给对等实体。
  • 技巧16:理解TCP的有序释放操作

    • 有序释放是在确保没有数据丢失的情况下拆除n连接的一个过程。
    • shutdown与close的区别
  • 技巧17:考虑用inetd来装载应用程序

  • 技巧18:考虑用tcpmux为服务器“分配”知名端口

  • 技巧19:考虑使用两条TCP连接

  • 技巧20:使应用程序成为事件驱动的(1)

  • 技巧21:使应用程序成为事件驱动的(2)

  • 技巧22:不要用TIME-WAIT暗杀来关闭一条连接

    • 通常只有一端——主动关闭的那一端会进入TIME-WAIT状态
    • 使用TIME-WAIT状态主要由两个目的:
      1) 维护连接状态,以防主动关闭连接的那段发送的最后一条ACK丢失后造成另一端重新发送FIN信号
      2) 为耗尽网络中所有此连接的“走失段”提供时间
  • 技巧23:服务器应该设置SO_REUSERADDR选项

  • 技巧24:可能的话,使用一个大规模的写操作,而不是多个小规模的写操作

    • 上下文的切换耗时
    • Nagle算法影响
  • 技巧25:理解如何使connect调用超时

  • 技巧26:避免数据复制

  • 技巧27:使用前将结构sockaddr_in清零

  • 技巧28:不要忘记字节的“性别”

  • 技巧29:不要将IP地址或端口号硬编入应用程序中

  • 技巧30:理解已连接的UDP套接字

    • connect操作
  • 技巧31:记住,并不是所有程序都是用C编写的

  • 技巧32:理解缓冲区长度带来的影响

  • 技巧33:熟悉ping使用工具

    • ping没有使用TCP或UDP,因此没有相关的知名端口,使用ICMP
  • 技巧34:学习使用tcpdump或类似的工具

  • 技巧35:学习使用traceroute

    • traceroute是诊断网络问题,学习网络路由以及探查网络拓扑的非常游泳的工具。
  • 技巧36:学习使用ttcp

  • 技巧37:学习使用lsof

  • 技巧38:学习使用netstat

  • 技巧39:学习使用系统中的调用追踪工具(strace)

  • 技巧40:构建并使用捕获ICMP报文的工具

  • 技巧41:读Stevens的书

  • 技巧42:阅读代码

  • 技巧43:访问RFC编辑者的页面

  • 技巧44:经常访问新闻组